package com.titaniume.java;

import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils;
import org.junit.Test;

import java.io.*;

/**
 *@program: JavaSenior
 *@description:
 *
 * 一：流的分类：
 * 1.操作数据单位： 字节流，字符流
 * 2.数据的流向：输入流，输出流
 * 3.流的角色：节点流，处理流
 *
 *
 * 二：流的提醒结构
 * 抽象基类          节点流 (或文件流)                                 缓存流（处理流的一种）
 * InputStream      FileInputStream  (read(byte [] buffer))              BufferdInputStream  (read(byte [] buffer))
 * OutputStream     FileOutputStream  (write(byte [] buffer,0,len))      BufferdOutputStream  (write(byte [] buffer,0,len)) /flush()
 * Reader           FileReader (read(char [] cbuf))                      BufferdReader (read(char [] cbuf) / readLine())
 * Writer           FileWriter (write(char [] cbuf,0,len))               BufferdWriter (write(char [] cbuf,0,len)) /flush()
 *
 *
 *@author: renfei.huang
 *@create: 2021-10-15 15:46
 */
public class FileReaderWriterTest {

    public static void main(String[] args) {
        File file = new File("hello.txt"); //相较于当前工程
        //E:\lean\JavaSenior\hello.txt
        System.out.println(file.getAbsolutePath());

        File file1 = new File("day09\\hello.txt");
        System.out.println(file1.getAbsolutePath());
    }


    /*
     *
     * 将day09下面的hello.txt文件内容读入到程序中，并输出到控制台
     *
     * 说明：
     * 1.reader()d的理解 返回读入的一个字符。如果达到文件末尾，返回-1
     * 2.异常的处理：为例保证资源一定可以执行关闭操作，需要使用try-cache-finally处理
     * 3.读入的文件一定要存在，否则就会报FileNotFoundException
     *
     * */
    @Test
    public void testFileReader() {
        FileReader fileReader = null;
        try {
            //1.实例化File对象，指明要操作的文件
            File file = new File("hello.txt"); //相较于当前model

            //2.提供具体的流
            fileReader = new FileReader(file);

            //3.数据的读入
            //方式一：
            //read(): 返回读入的一个字符。如果达到文件末尾，返回-1
//         int data = fileReader.read();
//         while (data!= -1){
//             System.out.print((char)data);
//             data = fileReader.read();
//         }

            //方式二： 语法针对与方式一的修改
            int data;
            while ((data = fileReader.read()) != -1) {
                System.out.print((char) data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4.流的关闭操作
             /*try {
                 if(fileReader!=null){
                     fileReader.close();
                 }
             } catch (IOException e) {
                 e.printStackTrace();
             }*/
            //或
            if (fileReader != null) {
                try {
                    fileReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
    }


    //对reader()操作升级，使用read()重载方法
    @Test
    public void testFileReader1() {
        //1.File类的实例化

        FileReader fileReader = null;
        try {
            File file = new File("hello.txt");

            //2.FileReader流的实例化
            fileReader = new FileReader(file);

            //3.读入操作
            //read(char[] cbuf) :返回每次读入cbuf数组中的个数。如果达到末尾返回-1
            char[] cbuf = new char[5];
            int len;
            while((len = fileReader.read(cbuf)) != -1){
                 //方式一：
                //错误的写法
//                for (int i = 0; i <cbuf.length ; i++) {
//                    System.out.print(cbuf[i]);
//                }

                //正确的写法
//                for (int i = 0; i < len; i++) {
//                    System.out.print(cbuf[i]);
//                }

                //方式二：
                //错误写写法
//                String str = new String(cbuf);
//                System.out.print(str);

                //正确的写法
                String str = new String(cbuf, 0, len);
                System.out.print(str);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(fileReader!=null){
                //4.关闭资源
                try {
                    fileReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }


    /*
    *
    * 从内存中写出数据到硬盘文件
    *
    * 说明：
    * 1.输出操作，对于file可以不存在的。并不会报异常
    * 2. File对应的硬盘中的文件如果不存在，在输出的过程中，会自动创建
    *    File对应的磁盘中的文件如果存在：
    *       如果流使用的构造器是：FileWriter(file,false) /FilWriter(file):对原有文件的覆盖
    *       如果流使用的构造器是：FileWriter(file,true): 不会对原有文件覆盖，而是在原有文件的基础上追加内容
    *
    *
    * */
    @Test
    public  void testFileWriter() throws IOException {

        //1.提供File类的对象，指明写出文件
        File file = new File("hello.txt");

        //2.提供FileWriter的对象，用于数据的写出
        FileWriter fileWriter = new FileWriter(file,false);

        //3.写出的具体操作
        fileWriter.write("you jump i jump\n");
        fileWriter.write("you need to have a dream");


        //4.流资源的关闭
        fileWriter.close();

    }


    /*
    *
    * 读取磁盘文件 在写入到磁盘
    *  类似复制
    *
    * */
    @Test
    public void testFileReaderFileWriter() throws IOException {

        //1.创建File类的对象，指明读入和写出的文件

        FileReader fileReader = null;
        FileWriter fileWriter = null;
        try {

            //不能使用字符流来处理图片等字节数据 （图片是字节流文件）
            File srcFile = new File("彼岸图网.jpg");
            File destFile = new File("彼岸图网2.jpg");

//            File srcFile = new File("hello.txt");
//            File destFile = new File("hello2.txt");


            //2.创建输入流和输出流的对象
            fileReader = new FileReader(srcFile);
            fileWriter = new FileWriter(destFile);

            //3.数据的读入和写出操作
            char [] cbuf = new char[5];
            int len; //记录每次读入到cbuf数组中的字符个数
            while ((len = fileReader.read(cbuf))!=-1){
                //每次写出len个字符
                fileWriter.write(cbuf,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4.关闭流资源

       //方式一：
//            if(fileReader!=null){
//                try {
//                    fileReader.close();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }finally {
//                    if(fileWriter!=null){
//                        try {
//                            fileWriter.close();
//                        } catch (IOException e) {
//                            e.printStackTrace();
//                        }
//                    }
//                }
//            }

          //方式二：
            if(fileReader!=null){
                try {
                    fileReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if(fileWriter!=null){
                try {
                    fileWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }


    }


    //使用字节流操作图片
    @Test
    public void testFileReaderFileWriter1() throws IOException {

        //1.创建File类的对象，指明读入和写出的文件

        FileInputStream fileReader = null;
        FileOutputStream fileWriter = null;
        try {

            //不能使用字符流来处理图片等字节数据 （图片是字节流文件）
//            File srcFile = new File("彼岸图网.jpg");
//            File destFile = new File("彼岸图网2.jpg");

            File srcFile = new File("hello.txt");
            File destFile = new File("hello2.txt");


            //2.创建输入流和输出流的对象
            fileReader = new FileInputStream(srcFile);
            fileWriter = new FileOutputStream(destFile);

            //3.数据的读入和写出操作
            byte [] cbuf = new byte[1024];
            int len; //记录每次读入到cbuf数组中的字符个数
            while ((len = fileReader.read(cbuf))!=-1){
                //每次写出len个字符
                fileWriter.write(cbuf,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4.关闭流资源

            //方式二：
            if(fileReader!=null){
                try {
                    fileReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if(fileWriter!=null){
                try {
                    fileWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }


    }





}
